File: xil_interface_lib.c

    1   /* Copyright 2006-2011 The MathWorks, Inc. */
    2   
    3   /* 
    4    * File: xil_interface_lib.c
    5    *
    6    * SIL/PIL support library
    7    *
    8    */
    9   
   10   #include "xil_interface_lib.h"
   11   #include "xil_interface_lib_private.h"
   12   #include "xil_data_stream.h"
   13   #include "xil_interface.h"
   14   #ifdef LDRA_ENABLED
   15   #include "code_coverage_utils.h"
   16   #endif /* LDRA_ENABLED */
   17   
   18   /* Internal state variable holding information about the
   19    * XILIOData currently being processed. 
   20    *
   21    * Note: this variable is shared by UDATA processing code
   22    * and YDATA processing code and used for all IO.
   23    *
   24    */
   25   static XILIOData * xilIODataPtr;
   26   
   27   /* static functions */
   28   static void getNextXILIOData(void) {
   29      /* increment xilIOData ptr if we have not reached the end */
   30      if (xilIODataPtr->memUnitLength!=0) {
   31         xilIODataPtr++;
   32      }
   33   }
   34   
   35   static XIL_PROCESSDATA_ERROR_CODE processData(XIL_IO_TYPE io_type, 
   36         uint32_T fcnid, 
   37         XIL_COMMAND_TYPE_ENUM command,
   38         uint32_T commandIdx)  {
   39      XIL_PROCESSDATA_ERROR_CODE processDataErrorCode = XIL_PROCESSDATA_SUCCESS;
   40      int moreXILIOData = 1;
   41      /* initialise before beginning to process data */
   42      switch(io_type) {
   43         case XIL_UDATA_IO:
   44            if (xilGetUIOData(fcnid, command, commandIdx, &xilIODataPtr)) {
   45               /* no udata processing to be done - we're complete */
   46               processDataErrorCode = XIL_PROCESSDATA_SUCCESS;
   47               return processDataErrorCode;
   48            }
   49            break;
   50         case XIL_YDATA_IO: {
   51            MemUnit_T responseId = XIL_RESPONSE_OUTPUT_DATA;
   52            if (xilGetYIOData(fcnid, command, commandIdx, &xilIODataPtr)) {
   53               /* no ydata processing to be done - we're complete */
   54               processDataErrorCode = XIL_PROCESSDATA_SUCCESS;
   55               return processDataErrorCode;
   56            }
   57            /* send response id */   
   58            if (xilWriteData(&responseId, sizeof(responseId)) != XIL_DATA_STREAM_SUCCESS) {
   59               processDataErrorCode = XIL_PROCESSDATA_DATA_STREAM_ERROR;
   60               return processDataErrorCode;
   61            }
   62            break;
   63         }
   64         default:
   65            /* programming error */
   66            processDataErrorCode = XIL_PROCESSDATA_IO_TYPE_ERROR;
   67            return processDataErrorCode;
   68      }        
   69      while(moreXILIOData) {
   70         switch(io_type) {
   71            case XIL_UDATA_IO:
   72               if (xilReadData(xilIODataPtr->address, xilIODataPtr->memUnitLength) != XIL_DATA_STREAM_SUCCESS) {
   73                  processDataErrorCode = XIL_PROCESSDATA_DATA_STREAM_ERROR;
   74                  return processDataErrorCode;
   75               }
   76               break;
   77            case XIL_YDATA_IO:
   78               if (xilWriteData(xilIODataPtr->address, xilIODataPtr->memUnitLength) != XIL_DATA_STREAM_SUCCESS) {
   79                  processDataErrorCode = XIL_PROCESSDATA_DATA_STREAM_ERROR;
   80                  return processDataErrorCode;       
   81               }
   82               break;
   83            default:
   84               /* programming error */
   85               processDataErrorCode = XIL_PROCESSDATA_IO_TYPE_ERROR;
   86               return processDataErrorCode;
   87         }        
   88         /* get next xilIOData */
   89         getNextXILIOData();         
   90         if (xilIODataPtr->memUnitLength == 0) {
   91            moreXILIOData = 0;
   92         }
   93      }
   94      return processDataErrorCode;
   95   }
   96   
   97   static XIL_INTERFACE_LIB_ERROR_CODE finalizeCommandResponse(XIL_RESPONSE_ERROR_ID errorId) {
   98      /* only send the error id if necessary */
   99      if (errorId != XIL_RESPONSE_ERROR_SUCCESS) {
  100         /* send response id code */
  101         MemUnit_T memUnitData = XIL_RESPONSE_ERROR;
  102         if (xilWriteData(&memUnitData, sizeof(memUnitData)) != XIL_DATA_STREAM_SUCCESS) {
  103           return XIL_INTERFACE_LIB_ERROR;      
  104         }
  105         /* send error id */
  106   	  memUnitData = (MemUnit_T) errorId;
  107         if (xilWriteData(&memUnitData, sizeof(memUnitData)) != XIL_DATA_STREAM_SUCCESS) {
  108            return XIL_INTERFACE_LIB_ERROR;      
  109         }	  
  110      }
  111      /* flush the output stream 
  112       * before beginning next command */
  113      if (xilDataFlush() != XIL_DATA_STREAM_SUCCESS) {
  114         return XIL_INTERFACE_LIB_ERROR;      
  115      }
  116      return XIL_INTERFACE_LIB_SUCCESS;
  117   }
  118   
  119   #define XIL_COMMAND_TYPE_SIZE sizeof(MemUnit_T)
  120   #define XIL_COMMAND_FCNID_SIZE sizeof(uint32_T)
  121   #define XIL_COMMAND_XILTID_SIZE sizeof(uint32_T)
  122   #define XIL_COMMAND_ERROR_STATUS_SIZE sizeof(MemUnit_T)
  123   
  124   #define XIL_RUN_EXIT_ERROR interfaceErrorCode = XIL_INTERFACE_LIB_ERROR; \
  125                                             return interfaceErrorCode
  126   #define XIL_RUN_EXIT return interfaceErrorCode
  127   
  128   XIL_INTERFACE_LIB_ERROR_CODE xilRun(void) {
  129      XIL_INTERFACE_LIB_ERROR_CODE interfaceErrorCode = XIL_INTERFACE_LIB_SUCCESS;
  130      XIL_COMMAND_TYPE_ENUM command;
  131      MemUnit_T commandCode;  
  132      uint32_T fcnid;
  133      uint32_T xilTID = 0;
  134      uint32_T commandIdx = 0;
  135   
  136      /* read the command code */
  137      if (xilReadData(&commandCode, XIL_COMMAND_TYPE_SIZE) != XIL_DATA_STREAM_SUCCESS) {
  138         XIL_RUN_EXIT_ERROR;      
  139      }
  140   
  141      /* cast from the MemUnit commandCode to the enumeration commandCode */
  142      command = (XIL_COMMAND_TYPE_ENUM) commandCode;
  143   
  144      /* read fcnid */
  145      if (xilReadData((MemUnit_T *) &fcnid, XIL_COMMAND_FCNID_SIZE) != XIL_DATA_STREAM_SUCCESS) {
  146         XIL_RUN_EXIT_ERROR; 
  147      }
  148   
  149      /* update commandIdx */
  150      switch(command) {
  151         case XIL_INIT_COMMAND:
  152         case XIL_INITIALIZE_COMMAND:
  153         case XIL_INITIALIZE_CONDITIONS_COMMAND:
  154         case XIL_CONST_OUTPUT_COMMAND:
  155         case XIL_TERMINATE_COMMAND:
  156         case XIL_PROCESS_PARAMS_COMMAND:
  157            /* no commandIdx */
  158            break;      
  159         case XIL_STEP_COMMAND:
  160         case XIL_ENABLE_COMMAND:
  161         case XIL_DISABLE_COMMAND:
  162            /* read xilTID */
  163            if (xilReadData((MemUnit_T *) &xilTID, XIL_COMMAND_XILTID_SIZE) != XIL_DATA_STREAM_SUCCESS) {
  164               XIL_RUN_EXIT_ERROR; 
  165            }
  166            commandIdx = xilTID;
  167            break;
  168         default:
  169            XIL_RUN_EXIT_ERROR;
  170      }
  171   
  172      /* process inputs if required by command */
  173      switch(command) {
  174         case XIL_INIT_COMMAND:
  175         case XIL_CONST_OUTPUT_COMMAND:
  176            /* no inputs */
  177            break;
  178         case XIL_INITIALIZE_COMMAND:
  179         case XIL_INITIALIZE_CONDITIONS_COMMAND:
  180         case XIL_STEP_COMMAND:
  181         case XIL_ENABLE_COMMAND:
  182         case XIL_DISABLE_COMMAND:
  183         case XIL_TERMINATE_COMMAND:
  184         case XIL_PROCESS_PARAMS_COMMAND:
  185            {
  186               XIL_PROCESSDATA_ERROR_CODE processDataError;
  187               /* process UData */ 
  188               processDataError = processData(XIL_UDATA_IO, fcnid, command, commandIdx);
  189               if (processDataError == XIL_PROCESSDATA_DATA_STREAM_ERROR) {
  190                  XIL_RUN_EXIT_ERROR; 
  191               } else if (processDataError != XIL_PROCESSDATA_SUCCESS) {
  192                  if (finalizeCommandResponse(XIL_RESPONSE_ERROR_PROCESS_UDATA) != XIL_INTERFACE_LIB_SUCCESS) {
  193                     XIL_RUN_EXIT_ERROR;
  194                  }
  195                  else {
  196                     XIL_RUN_EXIT;
  197                  }
  198               }
  199            }
  200            break;
  201         default:
  202            XIL_RUN_EXIT_ERROR;
  203      }
  204   
  205      /* call xilInterface function */
  206      switch(command) {
  207         case XIL_INIT_COMMAND:
  208            if (xilGetDataTypeInfo() != XIL_INTERFACE_SUCCESS) {
  209               XIL_RUN_EXIT_ERROR;
  210            }
  211            break;
  212         case XIL_CONST_OUTPUT_COMMAND:
  213            /* no function */
  214            break;
  215         case XIL_PROCESS_PARAMS_COMMAND:         
  216            if (xilProcessParams(fcnid) != XIL_INTERFACE_SUCCESS) {
  217               if (finalizeCommandResponse(XIL_RESPONSE_ERROR_PROCESS_PARAMS) != XIL_INTERFACE_LIB_SUCCESS) {
  218                  XIL_RUN_EXIT_ERROR;
  219               }
  220               else {
  221                  XIL_RUN_EXIT;
  222               }
  223            }
  224            break;
  225         case XIL_INITIALIZE_COMMAND: 
  226            if (xilInitialize(fcnid) != XIL_INTERFACE_SUCCESS) {
  227               if (finalizeCommandResponse(XIL_RESPONSE_ERROR_INITIALIZE) != XIL_INTERFACE_LIB_SUCCESS) {
  228                  XIL_RUN_EXIT_ERROR;
  229               }
  230               else {
  231                  XIL_RUN_EXIT;
  232               }
  233            }
  234            break;
  235         case XIL_INITIALIZE_CONDITIONS_COMMAND:
  236            if (xilInitializeConditions(fcnid) != XIL_INTERFACE_SUCCESS) {
  237               if (finalizeCommandResponse(XIL_RESPONSE_ERROR_INITIALIZE_CONDITIONS) != XIL_INTERFACE_LIB_SUCCESS) {
  238                  XIL_RUN_EXIT_ERROR;
  239               }
  240               else {
  241                  XIL_RUN_EXIT;
  242               }
  243            }
  244            break;
  245         case XIL_STEP_COMMAND: 
  246            /* call output */
  247            if (xilOutput(fcnid, xilTID) != XIL_INTERFACE_SUCCESS) {
  248               if (finalizeCommandResponse(XIL_RESPONSE_ERROR_STEP) != XIL_INTERFACE_LIB_SUCCESS) {
  249                  XIL_RUN_EXIT_ERROR;
  250               }
  251               else {
  252                  XIL_RUN_EXIT;
  253               }
  254            }
  255            /* call update */
  256            if (xilUpdate(fcnid, xilTID) != XIL_INTERFACE_SUCCESS) {
  257               if (finalizeCommandResponse(XIL_RESPONSE_ERROR_UPDATE) != XIL_INTERFACE_LIB_SUCCESS) {
  258                  XIL_RUN_EXIT_ERROR;
  259               }
  260               else {
  261                  XIL_RUN_EXIT;
  262               }
  263            }
  264            break;
  265         case XIL_TERMINATE_COMMAND:
  266            if (xilTerminate(fcnid) != XIL_INTERFACE_SUCCESS) {
  267               if (finalizeCommandResponse(XIL_RESPONSE_ERROR_TERMINATE) != XIL_INTERFACE_LIB_SUCCESS) {
  268                  XIL_RUN_EXIT_ERROR;
  269               }
  270               else {
  271                  XIL_RUN_EXIT;
  272               }
  273            }
  274            break;
  275         case XIL_ENABLE_COMMAND: 
  276            if (xilEnable(fcnid, xilTID) != XIL_INTERFACE_SUCCESS) {
  277               if (finalizeCommandResponse(XIL_RESPONSE_ERROR_ENABLE) != XIL_INTERFACE_LIB_SUCCESS) {
  278                  XIL_RUN_EXIT_ERROR;
  279               }
  280               else {
  281                  XIL_RUN_EXIT;
  282               }
  283            }
  284            break;
  285         case XIL_DISABLE_COMMAND: 
  286            if (xilDisable(fcnid, xilTID) != XIL_INTERFACE_SUCCESS) {
  287               if (finalizeCommandResponse(XIL_RESPONSE_ERROR_DISABLE) != XIL_INTERFACE_LIB_SUCCESS) {
  288                  XIL_RUN_EXIT_ERROR;
  289               }
  290               else {
  291                  XIL_RUN_EXIT;
  292               }
  293            }
  294            break;
  295         default: 
  296            XIL_RUN_EXIT_ERROR;
  297      }
  298   
  299      /* process outputs if required by command */
  300      switch(command) {
  301         case XIL_INIT_COMMAND:
  302         case XIL_PROCESS_PARAMS_COMMAND:
  303            /* no I/O */
  304            break;
  305         case XIL_INITIALIZE_COMMAND:
  306         case XIL_INITIALIZE_CONDITIONS_COMMAND:
  307         case XIL_CONST_OUTPUT_COMMAND:
  308         case XIL_STEP_COMMAND:
  309         case XIL_ENABLE_COMMAND:
  310         case XIL_DISABLE_COMMAND:
  311         case XIL_TERMINATE_COMMAND:
  312            {
  313               XIL_PROCESSDATA_ERROR_CODE processDataError;
  314               /* process YData */
  315               processDataError = processData(XIL_YDATA_IO, fcnid, command, commandIdx);
  316               if (processDataError == XIL_PROCESSDATA_DATA_STREAM_ERROR) {
  317                  XIL_RUN_EXIT_ERROR; 
  318               } else if (processDataError != XIL_PROCESSDATA_SUCCESS) {
  319                  if (finalizeCommandResponse(XIL_RESPONSE_ERROR_PROCESS_YDATA) != XIL_INTERFACE_LIB_SUCCESS) {
  320                     XIL_RUN_EXIT_ERROR;
  321                  } 
  322                  else {
  323                     XIL_RUN_EXIT;
  324                  }
  325               }
  326            }
  327            break;      
  328         default:
  329            XIL_RUN_EXIT_ERROR;
  330      }
  331   
  332   #ifdef LDRA_ENABLED
  333      /* upload code coverage execution history from target*/
  334      if (command == XIL_TERMINATE_COMMAND) {
  335         callTargetUploadFcns();
  336      }
  337   #endif /* LDRA_ENABLED */
  338   
  339      /* finalize the response */
  340      if (finalizeCommandResponse(XIL_RESPONSE_ERROR_SUCCESS) != XIL_INTERFACE_LIB_SUCCESS) {
  341         XIL_RUN_EXIT_ERROR;
  342      }
  343   
  344      /* Terminate this process when XIL simulation is complete */
  345      if (command == XIL_TERMINATE_COMMAND) {
  346          interfaceErrorCode = XIL_INTERFACE_LIB_TERMINATE;
  347      }
  348      XIL_RUN_EXIT;
  349   }
  350